import { useState, useEffect } from 'react';

/**
 * @typedef { Object } IReturnedUseTableSelection - Объект, содержащий массив выделенных строк
 *  и функции для работы с выбором строк.
 * @property { (number | string)[] } selectedRows - Массив выбранных строк.
 * @property { (id: (number | string)) => void } handleSelect - Функция для обработки выбора строки по id.
 * @property { (ids: (number | string)[]) => void } handleSelectAll - Функция для обработки выбора всех строк.
 */
interface IReturnedUseTableSelection {
    selectedRows: (number | string)[],
    handleSelect: (id: (number | string)) => void,
    handleSelectAll: (ids: (number | string)[]) => void
}

/**
* @function useTableSelection - Пользовательская функция для выбора строк таблицы.
*
* @param { T[] } tableData - Массив строк таблицы.
* @return { Object } - Объект, содержащий выбранные строки и две функции для работы с выбором строк.
*/
export function useTableSelection<T>(tableData: T): IReturnedUseTableSelection {

    const [selectedRows, setSelectedRows] = useState<(number | string)[]>([]);

    useEffect(() => {

        setSelectedRows([]);
    }, [tableData]);

    /**
     * @function handleSelect - Обрабатывает выбор строки по id.
     * 
     * @param { number | string } id - id выбранной строки.
     * @return { void}
     */
    const handleSelect = (id: (number | string)) => {

        setSelectedRows(prev => {

            if (prev.includes(id)) {
                return prev.filter(prevId => prevId !== id);
            }

            return [...prev, id];
        });
    };

    /**
     * 
     * @param ids @function handleSelectAll - Обрабатывает выбор всех строк.
     * 
     * @param { (number | string)[] } ids - Массив идентификаторов всех строк.
     * @return { void}
     */
    const handleSelectAll = (ids: (number | string)[]) => {

        setSelectedRows(prev => {

            if (prev.length === ids.length) {
                return [];
            }

            return ids;
        });
    }

    return {
        selectedRows,
        handleSelect,
        handleSelectAll
    }
}